#include <stdio.h>
#include <ctype.h>
#include <string.h>

#define KEY 6
char *keyword[KEY] = {"for", "if", "then", "else", "while", "do"};
char id[1024];
int num;
int token;

void lexical(FILE *fp) {
	char a[1024];
	char x = getc(fp);
	int i=0,n=0,k;
	num = 0;
	for(k=0;k<200;k++)
	{
	id[k]='\0';
	}
	if(x==' '||x=='\n'||x==10||x=='\t')
	{
	while(x==' '||x=='\n'||x==10||x=='\t')
    {
        x=getc(fp);
    }
	//ungetc(x,fp);

	}
	if(x=='f')
	{
	    id[i]=x;
	    i++;
		x=getc(fp);
		if(x=='o')
		{
		    id[i]=x;
            i++;
			x=getc(fp);
			if(x=='r')
			{
			    id[i]=x;

				token=1;

				return;
			}
			else
			{
			    id[--i]='\0';
				ungetc(x,fp);
			}

		}
		else{
            id[--i]='\0';
		ungetc(x,fp);}
	}
	if(x=='i')
	{
	    id[i]=x;
            i++;
		x=getc(fp);
		if(x=='f')
		{
		    id[i]=x;
			token=2;

			return;
		}
		else{
                id[--i]='\0';
            ungetc(x,fp);
		}

	}
	if(x=='w')
	{
	    id[i]=x;
            i++;
		x=getc(fp);
		if(x=='h')
		{
		    id[i]=x;
            i++;
			x=getc(fp);
			if(x=='i')
			{
			    id[i]=x;
            i++;
				x=getc(fp);
				if(x=='l')
				{
				    id[i]=x;
            i++;
					x=getc(fp);
					if(x=='e')
					{
					    id[i]=x;
						token=5;

						return;
					}
					else
					{
					     id[--i]='\0';
						ungetc(x,fp);
					}
				}
				else{
                    ungetc(x,fp);
                     id[--i]='\0';
				}

			}
			else
            {
                ungetc(x,fp);
                 id[--i]='\0';
            }




		}
		else
        {
            ungetc(x,fp);
             id[--i]='\0';
        }

	}
	if(x=='t')
	{
	     id[i]=x;
            i++;
		x=getc(fp);
		if(x=='h')
		{
		     id[i]=x;
            i++;
			x=getc(fp);
			if(x=='e')
			{
			     id[i]=x;
            i++;
				x=getc(fp);
				if(x=='n')
				{
				     id[i]=x;

					token=3;

					return;
				}
				else{
                    ungetc(x,fp);
                    id[--i]='\0';
				}


			}
			else{
                ungetc(x,fp);
                id[--i]='\0';
			}

		}
		else{
            ungetc(x,fp);
            id[--i]='\0';
		}

	}
	if(x=='e')
	{
	    id[i]=x;
            i++;
			x=getc(fp);
			if(x=='l')
			{
			    id[i]=x;
            i++;
					x=getc(fp);
					if(x=='s')
					{
					    id[i]=x;
            i++;
							x=getc(fp);
							if(x=='e')
							{
							    id[i]=x;

								token=4;

								return;
							}
							else{
                                ungetc(x,fp);
                                id[--i]='\0';
							}


					}
					else{
                        ungetc(x,fp);
                        id[--i]='\0';
					}

			}
			else
            {
                ungetc(x,fp);
                 id[--i]='\0';
            }

	}
	if(x=='d')
	{
	    id[i]=x;
            i++;
		x=getc(fp);
		if(x=='o')
		{
		    id[i]=x;

			token=6;

			return;
		}
		else{
            ungetc(x,fp);
             id[--i]='\0';
		}

	}
	if(x>64&&x<91||x>96&&x<123)
	{
		id[i]=x;
		i++;
		x=getc(fp);
		{
			while(x>64&&x<91||x>96&&x<123||x>='0'&&x<='9')
			{
				id[i]=x;
				i++;
				x=getc(fp);
			}
			token=10;
			ungetc(x,fp);
			return;
		}
	}
	if(x>='0'&&x<='9'){
	while(x>='0'&&x<='9')
	{
		a[n]=x;
		n++;
		x=getc(fp);
	}
	ungetc(x,fp);
	num=atoi(a);
	token=11;
	return;
	}
  if(x=='+')
	{
	    id[i]=x;
		token=13;

		return;
	}
	if(x=='-')
	{
	    id[i]=x;
		token=14;

		return;
	}
	if(x=='*')
	{
	    id[i]=x;
		token=14;

		return;
	}
	if(x=='/')
	{
	    id[i]=x;
		token=14;

		return;
	}
	if(x==':')
	{
	    id[i]=x;
		i++;
		x=getc(fp);
		if(x=='=')
		{
		    id[i]=x;

			token=18;

			return;
		}
		else{
            ungetc(x,fp);
            id[--i]='\0';
		}

	}
	if(x==':')
	{
	    id[i]=x;
		token=17;

		return;
	}
	if(x=='<')
	{
	    id[i]=x;
	    i++;
		x=getc(fp);
		if(x=='=')
		{
		    id[i]=x;
			token=22;

			return;
		}
		else if(x=='>')
		{
		    id[i]=x;
			token=21;

			return;
		}
		else{
			token=20;
            ungetc(x,fp);
             //id[--i]='\0';
			 return;
		}

	}
	/*if(x=='<')
	{
	    id[i]=x;
		token=20;

		return;
	}*/
	if(x=='>')
	{
	    id[i]=x;
	    i++;
		x=getc(fp);
		if(x=='=')
		{
		    id[i]=x;

			token=24;

			return;
		}
		else
        {
			token=23;
            ungetc(x,fp);
             //id[--i]='\0';
			 return;
        }

	}
	/*if(x=='>')
	{
	     id[i]=x;
		token=23;

		return;
	}*/
	if(x=='=')
	{
	     id[i]=x;
		token=25;

		return;
	}
	if(x==';')
	{
	     id[i]=x;
		token=26;

		return;
	}
	if(x=='(')
	{
	     id[i]=x;
		token=27;

		return;
	}
	if(x==')')
	{
	     id[i]=x;
		token=28;

		return;
	}
	if(x=='#')
	{
	     id[i]=x;
		token=0;

		return;
	}



	//process x
	//process each regex here
	//store the result in global variables id, num, or token
	//in case of backtrack, use
	//ungetc(x, fp);

}


int main(int argc, const char *argv[])
{
	/*if(argc < 2) {
		printf("insufficient args\n");
		return 1;
	}*/
	FILE *fp = fopen(argv[1], "r");
	do {
		lexical(fp);
		switch(token) {
			case 10: printf("(id, %s)\n", id); break;
			case 11: printf("(num, %d)\n", num); break;
			case -1: printf("error!\n"); break;
			default: printf("(%d, %s)\n", token, id);
		}
	} while(token != 0);


	fclose(fp);
	return 0;
}
